Модификация данных¶
Для выполнения операций модификации данных в Tarantool Column Store используются HTTP-запросы на адреса:
/insert(или/v2/insert)– вставка данных;/sql– вставка данных из выборки;/update– обновление данных.
Важно
Удаление данных вручную не поддерживается. Данные вытесняются автоматически при достижении предельного количества хранимых значений. Подробнее см. Удаление данных.
Вставка данных¶
Для вставки объектов в таблицу используйте POST-запрос на HTTP-адрес /insert или /v2/insert.
Примечание
Разница между адресами /insert и /v2/insert состоит в том, что запросы, направляемые
на адрес /insert всегда приводят к вставке данных в буфер записи таблицы, а запросы,
направляемые на адрес /v2/insert приводят к вставке данных или в буфер записи или в колоночное хранилище таблицы, в зависимости от параметров запроса.
В одном запросе можно передавать как один, так и несколько объектов для вставки. TCS обрабатывает объекты в том порядке, в каком они указаны в запросе. При вставке большого числа объектов наилучшая производительность достигается, когда число объектов в одном запросе на вставку совпадает с размером блока хранения, то есть равно 8192.
В значениях полей можно указывать как конкретные значения, так и null.
В теле запроса укажите в формате JSON:
название таблицы;
описания объектов для вставки в виде пар
колонка:значение.
Пример:
POST http://localhost:7777/insert HTTP/1.1
Content-Type: application/json
{
"table_name": "db.public.users",
"rows": [
{
"id": "1",
"username": "alice",
"is_deleted": false,
"created_at": 1710324848000
},
{
"id": "2",
"username": "bob",
"is_deleted": false,
"created_at": 1710324849000
}
]
}
Примечание
В схеме по умолчанию tcs.public можно указывать в table_name только
имя таблицы без каталога и схемы.
При необходимости можно ускорить обработку запроса на вставку, отключив для него ускоренное обновление буфера записи.
Также для запроса на вставку можно указать режим атомарной вставки.
При вставке в колоночный буфер (engine: memcs) доступны
два режима вставки:
вставка строк как массивов формата Apache Arrow (по умолчанию);
вставка строк как кортежей формата Tarantool (см. инструкцию по переключению на этот режим вставки).
В режиме вставки строк как массивов Apache Arrow производительность пакетных вставок
в колоночный буфер может быть выше, чем в случае пакетных вставок в строчный буфер
(engine: memtx).
При этом чем больше размер пакета, тем больше преимущество в производительности вставок
у колоночного буфера перед строчным.
Однако в этом режиме вставки снижается производительность одиночных вставок.
Вставка данных из выборки (insert into select)¶
Для вставки в таблицу объектов из выборки используйте POST-запрос на HTTP-адрес /sql.
В теле запроса укажите текст SQL-запроса, например:
POST http://localhost:7777/sql HTTP/1.1
Content-Type: application/json
INSERT INTO names SELECT name FROM users
В операциях вставки из выборки можно использовать все имеющиеся в TCS возможности SELECT-запросов, например осуществлять выборку из нескольких таблиц (оператор JOIN) и задавать условия с помощью оператора WHERE. Подробнее см. Справочник по SQL > Инструкция SELECT.
Порядок полей таблиц и типы должны совпадать. Например, возьмем две таблицы:
таблицу
names, которая содержит 2 поля,nameиage(именно в таком порядке они объявлены в модели данных);таблицу
users, которая содержит поляaddress,age,nameи прочие.
Следующий запрос составлен с учетом порядка полей в этих таблицах:
POST http://localhost:7777/sql HTTP/1.1
Content-Type: application/json
INSERT INTO names SELECT name, age FROM users
Обновление данных¶
Для обновления объектов в таблице используйте POST-запрос на HTTP-адрес /update.
Адрес /update поддерживает 2 типа запросов на обновление данных:
Сканирующее обновление данных в таблицах (
fullscan), которое можно использовать в общих случаях.Обновление данных в таблицах с использованием поиска по индексам колонок (
index-based), которое полезно использовать при определенных условиях.
В теле запроса укажите в формате JSON:
название таблицы;
операции обновления;
критерий выбора объектов для обновления.
Пример запроса на обновление данных:
POST http://localhost:7777/update
Content-Type: application/json
{
"table_name": "db.public.users",
"ops": [
{
"op": "set",
"column_name": "is_deleted",
"value": true
}
],
"conditions": [
{
"column_name": "username",
"value": "alice"
}
]
}
Поддерживаются следующие операции обновления (ops.op):
set– установка нового значения;append– добавление подстроки в строчное значение;addиsub– сложение и вычитание для числовых значений.
Примеры:
{
"op": "append",
"column_name": "username",
"value": "81_"
},
{
"op": "add",
"column_name": "age",
"value": 1
},
{
"op": "sub",
"column_name": "balance",
"value": 7
}
В качестве критерия выбора объектов для обновления (conditions) используется
совпадение значения колонки с указанными значениями (value). Вы можете указать
одно или несколько значений:
одно значение:
{ "column_name": "username", "value": "alice" }
несколько значений в виде массива:
{ "column_name": "username", "value": [ "alice", "bob" ] }
Чтобы обновить все объекты в таблице, укажите пустое условие выбора объектов:
"conditions": [].
Операция set позволяет указывать null в качестве нового значения поля. Например:
{
"table_name": "db.public.users",
"ops": [
{
"op": "set",
"column_name": "created_at",
"value": null
}
],
"conditions": [
{
"column_name": "username",
"value": [
"alice"
]
}
]
}
Можно обновлять данные в строках с пропущенными полями. Если поле, подлежащее обновлению,
отсутствует в записи, то оно принимается равным нулевому значению своего типа
(для чисел – 0, для строк – пустая строка '') и подлежит обновлению.
При необходимости это поведение можно изменить с помощью флага ignore_nulls.
Если он задан, то операция обновления не будет произведена, если поле, подлежащее
обновлению, окажется пустым. Например:
{
"table_name": "db.public.users",
"ops": [
{
"op": "set",
"column_name": "is_deleted",
"value": true
}
],
"conditions": [
{
"column_name": "username",
"value": "alice"
}
],
"ignore_nulls": true
}
В данном примере, если значение is_deleted окажется пустым, то оно не будет обновлено.
В результате запроса возвращается число записей, в которых было обновлено хотя бы одно поле.
По умолчанию запросы на HTTP-адрес /update производят обновление данных сразу в двух местах:
в буфере записи и в колоночном хранилище.
Обновление данных происходит атомарно (в одной транзакции).
При необходимости можно отключить обновление колоночного хранилища:
для конкретного запроса, указав в заголовке запроса параметр
"x-tcs-disable_column_update": "true";для всех запросов на обновление, указав в конфигурации TCS параметр
disable_column_update: true.
В результате по итогам выполнения запроса будет обновляться только буфер записи.
Примечание
В текущей версии TCS для запросов на обновление колоночного хранилища не поддерживается ускоренное обновление представления для чтения. Актуальные данные становятся доступными для чтения не сразу после произведенной операции, а только тогда, когда текущее представление для чтения будет обновлено в плановом порядке.
Примечание
Если для таблицы используется колоночный буфер записи (engine: memcs),
то нужно иметь в виду, что операция обновления по колоночному буферу всегда выполняется в режиме
полного сканирования (full scan), без поиска строк для обновления по индексу. Поэтому любое обновление
по колоночному буферу будет менее производительным, чем обновление по индексу по
строчному буферу (engine: memtx). При этом разница в производительности операций обновления
в режиме full scan на разных видах буферов будет минимальна.
Обновление данных с использованием индексов¶
Если в поле conditions запроса присутствуют колонки с параметром indexed: true, то при POST-запросе
на HTTP-адрес /update можно ускорить первичный поиск значений в таких колонках, используя их индексы.
Для этого в запросе нужно указать заголовок x-tcs-index_search: true:
POST http://localhost:7777/update
Content-Type: application/json
x-tcs-index_search: true
{
"table_name": "db.public.users",
"ops": [
{
"op": "set",
"column_name": "is_deleted",
"value": true
}
],
"conditions": [
{
"column_name": "username",
"value": "alice"
}
]
}
При использовании заголовка x-tcs-index_search: true в теле запроса можно указать параметр reversed: true.
Этот параметр запустит индексный поиск в обратном порядке. При этом сама модификация не изменится и будет
производиться поблочно из найденных элементов, в случайном порядке:
POST http://localhost:7777/update
Content-Type: application/json
x-tcs-index_search: true
{
"table_name": "db.public.users",
"ops": [
{
"op": "set",
"column_name": "is_deleted",
"value": true
}
],
"conditions": [
{
"column_name": "username",
"value": "alice"
}
],
"reversed": true
}
Если в поле conditions запроса указаны колонки с разным значением параметра indexed (indexed: true и indexed: false),
то поиск произведется сначала по индексным, а затем по неиндексным колонкам.
Для повышения производительности операции со включенным индексным поиском придерживайтесь следующих рекомендаций:
Рекомендуется строить поле
conditionsтаким образом, чтобы идущие первыми условия максимально уменьшали последующую выборку;Максимальная производительность индексного поиска достигается в конфигурации: 1 условие в поле
condition, при котором поиск происходит по индексной колонке и ищется 1 уникальная запись;Используйте индексный поиск для колонок, у которых указан бесконечный
index_depthили где известно, чтоindex_depthпревышает количество записей в колонке;Не включайте заголовок
x-tcs-index_search: trueдля большой выборки (половина или более записей);Заголовок
x-tcs-index_search: trueне рекомендуется применять к колонкам, которые дают мало уникальных значений (колонки с типами данныхbool,i8,u8), поскольку он может вызвать задержку отклика. Однако если условие, предшествующее индексному поиску, сильно отфильтрует записи и даст, к примеру, 1000 записей из миллиона или миллиарда, то индексный поиск не приведет к задержке.
Важно
Не используйте заголовок
x-tcs-index_search: trueдля операций/updateс колонками, у которых глубина индекса меньше количества существующих записей в колоночном хранилище. При таких условиях поиск может не дойти до нужной записи, а значит обновление не будет выполнено. Это приведёт к неконсистентности данных и к неочевидному состоянию, при котором некоторые поля, которых не было в индексах, не обновились после успешного выполнения запроса.При включенном индексном поиске необходимо указывать в поле
conditionsусловия для поиска по индексным полям, у которых установлены не-nullзначения. В противном случае поиск или не отработает, или вернёт сообщение об ошибке.
Удаление данных¶
Важно
Удаление данных вручную не поддерживается.